Snooping

What it is

Snooping is a feature of WHDLoad which performs validating and logging of CPU accesses to the Custom registers. If Snoop is activated all invalid accesses to the Custom registers will create a Access Fault and the installed program will be terminated. Invalid accesses are: Strobe registers can be read or written. The set of valid Custom registers can vary between OCS (Old ChipSet - A500, A1000, old A2000), ECS (Enhanced ChipSet - A600, new A2000, A3000) and AGA (Advanced Graphics - A1200, A4000). This is useful especially to locate bugs in old programs caused by undefined accesses to new AGA registers.

How it works

If Snoop is enabled, WHDLoad marks the addresses of the custom registers as invalid in the MMU translation tree. Because of this, each access to a custom register will result in an Access Fault exception. The exception handler in WHDLoad handles this exception. First it checks if the access is valid. If the access is invalid the program will be terminated. If the access is valid and it is a read operation the access will be emulated and program execution continues. If it is a write operation WHDload saves the value which should be written before emulation.
Because the overhead of the exception and the emulation sequence the program execution will slow down. How much it slows down depends on the CPU type, Chip Memory type (16/32 Bit) and Stackpointer alignment if Chip Memory is 32 Bit (LongWord aligned or not). It also differs for the access type (Byte/Word/LongWord, Read/Write). On the 68030 Writes are faster than Reads (because on reads the stackframe is 92 bytes on writes 32 bytes), on the 68060 Reads are faster because the emulation for Writes is more complex.

Blitter check

On the 68030 there are special checks concerning the blitter implemented. On each access to a blitter register WHDLoad checks the Blitter Busy Flag in the dmacon register. If the blitter is busy WHDLoad will terminate the program and show an appropriate requester. This has been implemented to detect bad code which does not correctly wait for the blitter to finish it's job. But due to the large delay caused by the exception processing, this check will detect missing waits only in conjunction with very big blitter operations.
If the custom register accessed is bltsize or bltsizh and the line mode is not enabled in the saved bltcon1 WHDLoad will check if the activated blitter operation will access any memory outside BaseMem. WHDLoad will calculate the first and the last word access for each activated DMA channel. If one address is outside the BaseMem area the program will be terminated with a requester. The calculation is designed to work with all modes (ascending/descending, positive/negativ modulos, odd modulos/pointers).
Remember that the line drawing mode will not verified and that all blitter registers can also be written by the copper if copcon is 1.

Future

It is planned to implement features like Freezing, Iconifing and a Picture Ripper. For these, Snoop is an essential assumption. Therefore it is recommended for install authors to check their installs with Snoop to secure future compatibility.

Requirements

An MMU is required for the Snoop feature. Also WHDLoad must use the MMU, therefore MMU/S must be enabled on 68030 machines.

Limitations

Bugs